﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Bramki
{
    class Obraz
    {
        /// <summary>
        /// Skaluje, kadruje etc. obraz, który następnie podawany jest na wejście SSN
        /// </summary>
        /// <param name="obraz">Obraz wczytany z pliku</param>
        /// <param name="szer">Szerokość do jakiej skalujemy</param>
        /// <param name="wys">Wysokość do jakiej skalujemy</param>
        /// <returns>Przetworzony obraz o rozmiarach podanych w parametrach</returns>
        public static Image przeskaluj(Image obraz, int szer, int wys)
        {
            // bitmapa wynikowa
            Bitmap result = new Bitmap(szer, wys);
            
            //granice obrazka, potrzebne do kadrowania
            int gora=0, dol=0, lewo=0, prawo=0;
            Color bialy = Color.FromArgb(255,255,255,255);
            bool go=true;
            //sprawdzanie granic od góry
            for (int i = 0; i < obraz.Height && go; i++)
            {
                for (int j = 0; j < obraz.Width; j++)
                {
                    
                    if (((Bitmap)obraz).GetPixel(j, i).ToArgb() != bialy.ToArgb())
                    {
                        gora = i;
                        go = false;
                        break;
                    }
                }
            }
            go = true;
            //sprawdzanie granic od dołu
            for (int i = obraz.Height-1; i >= 0 && go; i--)
            {
                for (int j = 0; j < obraz.Width; j++)
                {
                    if (((Bitmap)obraz).GetPixel(j, i).ToArgb() != bialy.ToArgb())
                    {
                        dol = i;
                        go = false;
                        break;
                    }
                }
            }
            go = true;
            //sprawdzanie granic od lewej
            for (int i = 0 ; i < obraz.Width && go; i++)
            {
                for (int j = 0; j < obraz.Height; j++)
                {
                    if (((Bitmap)obraz).GetPixel(i, j).ToArgb() != bialy.ToArgb())
                    {
                        lewo = i;
                        go = false;
                        break;
                    }
                }
            }
            go = true;
            //sprawdzanie granic od prawej
            for (int i = obraz.Width - 1; i >= 0 && go; i--)
            {
                for (int j = 0; j < obraz.Height; j++)
                {
                    if (((Bitmap)obraz).GetPixel(i, j).ToArgb() != bialy.ToArgb())
                    {
                        prawo = i;
                        go = false;
                        break;
                    }
                }
            }
            //zmienne służące do wykadrowania obrazu
            Rectangle srcRect = new Rectangle(lewo, gora, prawo - lewo, dol - gora);
            Rectangle destRect = new Rectangle(0, 0, szer, wys);
            using (Graphics graphics = Graphics.FromImage(result))
            {
                //ustawia opcje skalowania
                graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                GraphicsUnit units = GraphicsUnit.Pixel;
                
                //rysuje obrazek na bitmapie wynikowej
                graphics.DrawImage(obraz, destRect,srcRect,units);
            }
            //zwraca bitmape po przeskalowaniu
            return result;
        }

        
      

        /// <summary>
        /// zamienia przeskalowany obraz na tablicę 100-elementową (wejście SSN)
        /// </summary>
        /// <param name="wejscie">Przeskalowany i przetworzony obraz</param>
        /// <returns>Dane wejściowe SSN (tablica 1-wymiarowa 100-elementowa)</returns>
        internal static double[] zamienNaDane(Image wejscie)
        {
            double[] wynik = new Double[wejscie.Width*wejscie.Height];
            Bitmap bitmapa = (Bitmap)wejscie;
            for (int i=0;i<wejscie.Width;i++)
            {
                for (int j = 0; j < wejscie.Height; j++)
                {
                    //zamienia na 0 lub 1 w zaleznosci od odcienia szarości
                 /*   if (bitmapa.GetPixel(i, j).R < 250)
                    {
                        wynik[i*10 + j] = 1.0;
                    }
                    else
                    {
                        wynik[i*10 + j] = 0.0;
                    }*/
                    int w = 255-bitmapa.GetPixel(i, j).R;
                    wynik[i * 10 + j] = (double)w / (double)255;
                    

                }
            }


            return wynik;
        }
    }
}
